def sep(label=''):
    '''
    Utility function, to separate command line output.
    :param label: Optional label.
    :return: None
    '''
    print('-' * 16, label, '-' * 16)


# （一）实现函数；（５０分，每小题5分）
# 1．写无参函数word，输出“知识很简单、学习很快乐、潜力无极限”。调用它查看效果
sep('1')


def word():
    print('知识很简单、学习很快乐、潜力无极限')


word()

# ２．写匿名函数，无参，输出“知识很简单、学习很快乐、潜力无极限”。并调用这个匿名函数
sep('2')
(lambda: print('知识很简单、学习很快乐、潜力无极限'))()

# 3. 写有参函数words（n），输出“知识很简单、学习很快乐、潜力无极限”n遍。并调用
sep('3')


def words(n):
    for i in range(n):
        print('知识很简单、学习很快乐、潜力无极限')


words(3)

# ４．写一个求长方体体积的函数volume(a,b,c)，有参有返，分别代表长方体的３条边。调用volume(11,12,13)
sep('4')


def volume(a, b, c):
    return a * b * c


print('长方体体积:', volume(11, 12, 13))

# 5.写一个求长方体体积的函数volume()，无参无返，调用这个函数，求出长宽高分别为11,12,13的长方体体积
sep('5')


def volume():
    a = float(input('a=?:'))
    b = float(input('b=?:'))
    c = float(input('c=?:'))
    print('Volume =', a * b * c)


volume()

# 6.写一个求长方体体积的有参匿名函数， a,b,c分别代表长方体的３条边。调用这个函数，求出长宽高分别为11,12,13的长方体体积
sep('6')
print('Volume =', (lambda a, b, c: a * b * c)(11, 12, 13))

# 7.写一个三角形图案生成的函数并调用，名称为triangle：
# 1）两个参数n,c, n代表图案有多少行，c代表这个图案由什么符号构成
# 2）默认情况下，n＝7,c＝“*”，即调用triangle（）时，生成如右图形：
# 3）调用triangle（10，‘$’）实现右图
sep('7')


def triangle(n=7, c='*'):
    for i in range(1, n + 1):
        for j in range(1, i + 1):
            print(c, end='')
        print()


triangle()
triangle(10, '$')

# 8.用递归函数，计算自然数Ｎ＝1,2,3,…，100的累加和
sep(8)


def recursive_sum(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return n + recursive_sum(n - 1)


print('Sum 1~100 =', recursive_sum(100))

# 9.用递归函数，实现输出斐波那契(Leonardoda Fibonacci)数列前１５项
sep(9)


def fib(n):
    if n <= 0:
        return 0
    elif 1 <= n <= 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)


print('Fibonacci:')
for i in range(1, 15 + 1):
    print(i, fib(i))

# 10.写一函数，判断一个数字是否为既能被a整除、又能被b整除的奇数。并且求出1-100范围内的能被３整除、又能被7整除的奇数。
sep(10)


def is_odd_ab(n, a, b):
    if not (n % 2):
        return False
    if n % a:
        return False
    if n % b:
        return False
    return True


print('1-100范围内的能被３整除、又能被7整除的奇数:')
print(', '.join([str(i) for i in range(1, 100 + 1) if is_odd_ab(i, 3, 7)]))
